package com.service.impl;

import com.dao.OrderDao;
import com.dao.impl.OrderDaoImpl;
import com.pojo.Order;
import com.pojo.Ticket;
import com.service.OrderService;
import com.service.TicketService;

import java.util.List;

/**
 * 订单业务实现类 调用dao层执行对应的sql
 */
public class OrderServiceImpl implements OrderService {
    OrderDao orderDao = new OrderDaoImpl();
    TicketService ticketService =  new TicketServiceImpl();
    // 根据用户名和航班ID查询订单
    public Order selectUserAndFlightById(String userName, Integer flightId) {
        // 通过orderDao查询用户名和航班ID的订单
        return orderDao.selectUserAndFlightById(userName,flightId);
    }

    // 插入订单
    @Override
    public void insertOrder(Order order) {
        // 通过orderDao插入订单
        orderDao.insertOrder(order);
    }

    // 根据用户名查询订单
    @Override
    public List<Order> selectByUserName(String name,String page, String limit) {
        // 通过orderDao根据用户名查询订单，并返回分页结果
        return orderDao.selectByUserName(name,page,limit);
    }

    // 根据用户名统计订单数量
    @Override
    public int selectByUserNameCount(String name) {
        // 通过orderDao根据用户名统计订单数量
        return orderDao.selectByUserNameCount(name);
    }

    // 更新订单状态 打印出票
    @Override
    public void updateStatus(Integer orderId, String status) {
        // 通过orderDao更新订单状态
        orderDao.updateStatus(orderId, status);
        if(status.equals("已出票")){ //出票请求则生成机票
            // 查询订单
            Ticket ticket =  orderDao.getOrderById(orderId);
            //用户提出打印出票请求 生成机票信息
            ticketService.insertTicket(ticket);
        }
        if(status.equals("已退票")){ //出票请求则生成机票
            // 查询订单
            Ticket ticket =  orderDao.getOrderById(orderId);
            //更具用户ID和航班ID删除对应的机票
            ticketService.deleteTicket(ticket);
        }



    }
    // 查询所有订单
    @Override
    public List<Order> selectAllOrder(String page, String limit) {
        // 通过orderDao查询所有订单，并返回分页结果
        return orderDao.selectAllOrder(page, limit);
    }

    // 查询所有订单数量
    @Override
    public int selectAllOrderCount() {
        // 通过orderDao查询所有订单数量
        return orderDao.selectAllOrderCount();
    }

    // 根据用户名查询订单
    @Override
    public List<Order> selectTicketByName(String name, String page, String limit) {
        // 通过orderDao根据用户名查询订单，并返回分页结果
        return orderDao.selectTicketByName(name, page, limit);
    }

    // 按照旅客、起始地点和创建时间查询订单
    @Override
    public List<Order> companySelectOrder(String name, String startAdd, String createTime, String page, String limit) {
        // 通过orderDao按照旅客、起始地点和创建时间查询订单，并返回分页结果
        return orderDao.companySelectOrder(name, startAdd, createTime, page, limit);
    }

    // 按照旅客名称、起始地点和创建时间统计订单数量
    @Override
    public int companySelectOrderCount(String name, String startAdd, String createTime) {
        // 通过orderDao按照旅客名称、起始地点和创建时间统计订单数量
        return orderDao.companySelectOrderCount(name, startAdd, createTime);
    }

    /**
     * 查询退票订单
     * @param page
     * @param limit
     * @return
     */
    @Override
    public List<Order> selectReturnTicket(String page, String limit) {
        // 通过orderDao查询所有退票订单，并返回分页结果
        return orderDao.selectReturnOrder(page, limit);
    }

    /**
     * 查询退票订单数量
     * @return
     */
    @Override
    public int selectReturnTicketCount() {
        // 通过orderDao查询所有退票订单数量
        return orderDao.selectReturnOrderCount();
    }

    /**
     * 按照用户名、起始地点和创建时间查询退票订单
     * @param username
     * @param startAdd
     * @param createTime
     * @param page
     * @param limit
     * @return
     */
    @Override
    public List<Order> selectReturnTicketByCondition(String username, String startAdd, String createTime, String page, String limit) {
        return orderDao.selectReturnTicketByCondition(username, startAdd, createTime, page, limit);
    }

    /**
     * 按照用户名、起始地点和创建时间统计退票订单数量
     *
     * @param username
     * @param startAdd
     * @param createTime
     * @return
     */
    @Override
    public int countReturnTicketByCondition(String username, String startAdd, String createTime) {
        return orderDao.countReturnTicketByCondition(username, startAdd, createTime);
    }

}
